use std::net::{TcpListener, TcpStream};
use std::io::prelude::*;
use std::fs;
use hello::ThreadPool;

fn main() {
    // 创建 TCP 监听器，绑定到本地地址的 7878 端口。
    let listener = TcpListener::bind("127.0.0.1:7878").unwrap();

    // 创建一个包含 4 个线程的线程池。
    let pool = ThreadPool::new(4);

    // 循环接收连接请求，最多接收 n 个
    for stream in listener.incoming().take(10) { 
        let stream = stream.unwrap();
        pool.execute(|| {
            // 处理请求
            handle_connection(stream);
        });
    }

    println!("Shutting down.");
}

fn handle_connection(mut stream: TcpStream) {
    // 创建一个 512 字节的缓冲区。
    let mut buffer = [0; 512];

    stream.read(&mut buffer).unwrap();

    let get = b"GET / HTTP/1.1\r\n";

    let (status_line, filename) = if buffer.starts_with(get) { // 检查缓冲区数据是否以 GET 请求开始。
        ("HTTP/1.1 200 OK", "hello.html") // 如果是，返回 200 OK 状态和文件名。
    } else {
        ("HTTP/1.1 404 NOT FOUND", "404.html") // 如果不是，返回 404 NOT FOUND 状态和文件名。
    };

    let contents = fs::read_to_string(filename).unwrap(); // 读取相应文件的内容。
    let length = contents.len(); // 获取文件内容的长度。

    // 格式化 HTTP 响应。
    let response = format!( 
        "{}\r\nContent-Length: {}\r\n\r\n{}",
        status_line,
        length,
        contents
    );

    stream.write(response.as_bytes()).unwrap(); // 将响应写入 TCP 流。
    stream.flush().unwrap(); // 确保所有数据都被发送出去。
}